home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / enigma / earcd / varie / uae-0_64.lha / uae-0.6.4 / src / include / memory.h < prev    next >
C/C++ Source or Header  |  1996-09-03  |  5KB  |  185 lines

  1.  /* 
  2.   * UAE - The Un*x Amiga Emulator
  3.   * 
  4.   * memory management
  5.   * 
  6.   * Copyright 1995 Bernd Schmidt
  7.   */
  8.  
  9. #define kickmem_size 0x080000
  10.  
  11. #define chipmem_start 0x000000
  12. #define bogomem_start 0xC00000 
  13. #define kickmem_start 0xF80000
  14.  
  15. extern int ersatzkickfile;
  16.  
  17. extern char *address_space, *good_address_map;
  18.  
  19. typedef ULONG (*lget_afunc)(CPTR) REGPARAM;
  20. typedef UWORD (*wget_afunc)(CPTR) REGPARAM;
  21. typedef ULONG (*lget_func)(CPTR) REGPARAM;
  22. typedef UWORD (*wget_func)(CPTR) REGPARAM;
  23. typedef UBYTE (*bget_func)(CPTR) REGPARAM;
  24. typedef void (*lput_func)(CPTR,ULONG) REGPARAM;
  25. typedef void (*wput_func)(CPTR,UWORD) REGPARAM;
  26. typedef void (*bput_func)(CPTR,UBYTE) REGPARAM;
  27. typedef UBYTE *(*xlate_func)(CPTR) REGPARAM;
  28. typedef int (*check_func)(CPTR, ULONG) REGPARAM;
  29.  
  30. typedef struct {
  31.     /* These ones should be self-explanatory... */
  32.     lget_afunc alget;
  33.     wget_afunc awget;
  34.     lget_func lget;
  35.     wget_func wget;
  36.     bget_func bget;
  37.     lput_func lput;
  38.     wput_func wput;
  39.     bput_func bput;
  40.     /* Use xlateaddr to translate an Amiga address to a UWORD * that can
  41.      * be used to address memory without calling the wget/wput functions. 
  42.      * This doesn't work for all memory banks, so this function may call
  43.      * abort(). */
  44.     xlate_func xlateaddr;
  45.     /* To prevent calls to abort(), use check before calling xlateaddr.
  46.      * It checks not only that the memory bank can do xlateaddr, but also
  47.      * that the pointer points to an area of at least the specified size. 
  48.      * This is used for example to translate bitplane pointers in custom.c */
  49.     check_func check;
  50. } addrbank;
  51.  
  52. extern addrbank chipmem_bank;
  53. extern addrbank kickmem_bank;
  54. extern addrbank custom_bank;
  55. extern addrbank clock_bank;
  56. extern addrbank cia_bank;
  57. extern addrbank rtarea_bank;
  58. extern addrbank expamem_bank;
  59. extern addrbank fastmem_bank;
  60.  
  61. extern void rtarea_init (void);
  62. extern void expamem_init (void);
  63. extern void expamem_reset (void);
  64.  
  65. extern ULONG fastmem_size, chipmem_size, bogomem_size;
  66.  
  67.  
  68. /* Default memory access functions */
  69.  
  70. extern int default_check(CPTR addr, ULONG size) REGPARAM;
  71. extern UBYTE *default_xlate(CPTR addr) REGPARAM;
  72. extern UWORD default_awget(CPTR addr) REGPARAM;
  73. extern ULONG default_alget(CPTR addr) REGPARAM;
  74.  
  75. extern addrbank membanks[65536];
  76. static __inline__ unsigned int bankindex(CPTR a)
  77. {
  78.     return a>>16;
  79. }
  80.  
  81. static __inline__ ULONG alongget(CPTR addr)
  82. {
  83.     return membanks[bankindex(addr)].alget(addr);
  84. }
  85. static __inline__ UWORD awordget(CPTR addr)
  86. {
  87.     return membanks[bankindex(addr)].awget(addr);
  88. }
  89. static __inline__ ULONG longget(CPTR addr)
  90. {
  91.     return membanks[bankindex(addr)].lget(addr);
  92. }
  93. static __inline__ UWORD wordget(CPTR addr)
  94. {
  95.     return membanks[bankindex(addr)].wget(addr);
  96. }
  97. static __inline__ UBYTE byteget(CPTR addr) 
  98. {
  99.     return membanks[bankindex(addr)].bget(addr);
  100. }
  101. static __inline__ void longput(CPTR addr, ULONG l)
  102. {
  103.     membanks[bankindex(addr)].lput(addr, l);
  104. }
  105. static __inline__ void wordput(CPTR addr, UWORD w)
  106. {
  107.     membanks[bankindex(addr)].wput(addr, w);
  108. }
  109. static __inline__ void byteput(CPTR addr, UBYTE b)
  110. {
  111.     membanks[bankindex(addr)].bput(addr, b);
  112. }
  113.  
  114. static __inline__ int check_addr(CPTR a)
  115. {
  116. #if defined(NO_EXCEPTION_3) || CPU_LEVEL > 1
  117.     return 1;
  118. #else
  119.     return (a & 1) == 0;
  120. #endif
  121. }
  122. extern int buserr;
  123.     
  124. extern void memory_init(void);    
  125. extern void map_banks(addrbank *bank, int first, int count);
  126.     
  127. static __inline__ ULONG get_along(CPTR addr) 
  128. {
  129.     if (check_addr(addr))
  130.     return longget(addr);
  131.     buserr = 1;
  132.     return 0;
  133. }
  134. static __inline__ UWORD get_aword(CPTR addr) 
  135. {
  136.     if (check_addr(addr))
  137.     return wordget(addr);
  138.     buserr = 1;
  139.     return 0;
  140. }
  141. static __inline__ ULONG get_long(CPTR addr) 
  142. {
  143.     if (check_addr(addr))
  144.     return longget(addr);
  145.     buserr = 1;
  146.     return 0;
  147. }
  148. static __inline__ UWORD get_word(CPTR addr) 
  149. {
  150.     if (check_addr(addr))
  151.     return wordget(addr);
  152.     buserr = 1;
  153.     return 0;
  154. }
  155. static __inline__ UBYTE get_byte(CPTR addr) 
  156. {
  157.     return byteget(addr); 
  158. }
  159. static __inline__ void put_long(CPTR addr, ULONG l) 
  160. {
  161.     if (!check_addr(addr))
  162.     buserr = 1;
  163.     longput(addr, l);
  164. }
  165. static __inline__ void put_word(CPTR addr, UWORD w) 
  166. {
  167.     if (!check_addr(addr))
  168.     buserr = 1;
  169.     wordput(addr, w);
  170. }
  171. static __inline__ void put_byte(CPTR addr, UBYTE b) 
  172. {
  173.     byteput(addr, b);
  174. }
  175.  
  176. static __inline__ UBYTE *get_real_address(CPTR addr)
  177. {
  178.     return membanks[bankindex(addr)].xlateaddr(addr);
  179. }
  180.  
  181. static __inline__ int valid_address(CPTR addr, ULONG size)
  182. {
  183.     return membanks[bankindex(addr)].check(addr, size);
  184. }
  185.